const mysql = require('mysql2/promise');
const fs = require('fs').promises;
const path = require('path');

// 数据库配置
const dbConfig = {
    host: process.env.DB_HOST || '43.143.253.188',
    port: parseInt(process.env.DB_PORT) || 3306,
    user: process.env.DB_USER || 'nextjs',
    password: process.env.DB_PASS || 'yEAiRE2jcxTyRBy5',
    database: process.env.DB_NAME || 'nextjs',
    timezone: '+08:00'
};

// 地图数据文件路径
const MAP_DATA_FILE = path.join(__dirname, '../../output/websocket_data_area.json');

async function importMapAreas () {
    let connection;

    try {
        console.log('🚀 开始导入地图区域数据...');
        console.log('📊 数据库配置:', {
            host: dbConfig.host,
            port: dbConfig.port,
            user: dbConfig.user,
            database: dbConfig.database,
            timezone: dbConfig.timezone
        });

        // 连接数据库
        connection = await mysql.createConnection(dbConfig);
        console.log('✅ 数据库连接成功');

        // 检查表是否存在，如果不存在则创建
        await createTableIfNotExists(connection);

        // 读取地图数据文件
        const mapData = await loadMapData();
        console.log(`📁 读取到 ${mapData.length} 条地图数据`);

        // 清空现有数据（可选，取消注释如果需要清空）
        // await clearExistingData(connection);

        // 导入数据
        const result = await importData(connection, mapData);

        console.log('🎉 地图区域数据导入完成！');
        console.log(`📈 成功导入 ${result.inserted} 条记录`);
        if (result.duplicates > 0) {
            console.log(`⚠️  跳过 ${result.duplicates} 条重复记录`);
        }

    } catch (error) {
        console.error('❌ 导入过程中发生错误:', error.message);
        if (error.code) {
            console.error('错误代码:', error.code);
        }
        process.exit(1);
    } finally {
        if (connection) {
            await connection.end();
            console.log('🔌 数据库连接已关闭');
        }
    }
}

async function createTableIfNotExists (connection) {
    const createTableSQL = `
    CREATE TABLE IF NOT EXISTS \`map_areas\` (
      \`id\` int(11) NOT NULL COMMENT '地图区域ID',
      \`name\` varchar(100) NOT NULL COMMENT '地图区域名称',
      \`created_at\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      \`updated_at\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
      PRIMARY KEY (\`id\`),
      KEY \`idx_name\` (\`name\`),
      KEY \`idx_created_at\` (\`created_at\`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='地图区域基础表'
  `;

    await connection.execute(createTableSQL);
    console.log('✅ 地图区域表检查/创建完成');
}

async function loadMapData () {
    try {
        const data = await fs.readFile(MAP_DATA_FILE, 'utf8');
        return JSON.parse(data);
    } catch (error) {
        throw new Error(`无法读取地图数据文件: ${error.message}`);
    }
}

async function clearExistingData (connection) {
    await connection.execute('DELETE FROM map_areas');
    console.log('🗑️  已清空现有数据');
}

async function importData (connection, mapData) {
    let inserted = 0;
    let duplicates = 0;

    // 使用事务批量插入
    await connection.beginTransaction();

    try {
        for (const area of mapData) {
            try {
                // 使用 INSERT ... ON DUPLICATE KEY UPDATE 来处理重复数据
                const sql = `
          INSERT INTO map_areas (id, name) 
          VALUES (?, ?) 
          ON DUPLICATE KEY UPDATE 
            name = VALUES(name),
            updatedAt = CURRENT_TIMESTAMP
        `;

                await connection.execute(sql, [area.id, area.name]);
                inserted++;

                // 每100条记录显示一次进度
                if (inserted % 100 === 0) {
                    console.log(`📊 已处理 ${inserted} 条记录...`);
                }

            } catch (error) {
                if (error.code === 'ER_DUP_ENTRY') {
                    duplicates++;
                } else {
                    throw error;
                }
            }
        }

        await connection.commit();
        console.log('💾 事务提交成功');

    } catch (error) {
        await connection.rollback();
        console.error('❌ 事务回滚:', error.message);
        throw error;
    }

    return { inserted, duplicates };
}

// 主函数
if (require.main === module) {
    importMapAreas().catch(error => {
        console.error('❌ 程序执行失败:', error);
        process.exit(1);
    });
}

module.exports = { importMapAreas };
